Objetivo Principal: Desarrollar un modelo ARIMA robusto para predicción de precios de Tesla que capture la dinámica temporal y proporcione pronósticos confiables.
ARIMA(p,d,q) combina tres componentes:
library(quantmod)
library(forecast)
library(tseries)
library(plotly)
library(dplyr)
# Descargar datos de Tesla
getSymbols('TSLA', src='yahoo', from='2020-01-01', to=Sys.Date())## [1] "TSLA"
stats_data <- data.frame(
Métrica = c('Observaciones', 'Media', 'Desv. Est.', 'Mínimo', 'Máximo'),
Valor = c(
length(tesla_prices),
round(mean(tesla_prices, na.rm=T), 2),
round(sd(tesla_prices, na.rm=T), 2),
round(min(tesla_prices, na.rm=T), 2),
round(max(tesla_prices, na.rm=T), 2)
)
)
knitr::kable(stats_data, align='c')| Métrica | Valor |
|---|---|
| Observaciones | 1482.00 |
| Media | 233.40 |
| Desv. Est. | 93.68 |
| Mínimo | 24.08 |
| Máximo | 479.86 |
plot_ly(data.frame(
date = index(tesla_prices),
price = as.numeric(tesla_prices)
), x = ~date, y = ~price, type = 'scatter', mode = 'lines',
line = list(color = '#00d9ff', width = 2.5)) %>%
layout(
title = '<b>Evolución Histórica - Precio de Tesla</b>',
xaxis = list(title = 'Fecha', gridcolor = 'rgba(0,217,255,0.1)'),
yaxis = list(title = 'Precio (USD)', gridcolor = 'rgba(0,217,255,0.1)'),
plot_bgcolor = 'rgba(18, 22, 31, 0.5)',
paper_bgcolor = 'rgba(12, 16, 25, 0.5)',
font = list(color = '#e0e6ed'),
hovermode = 'x unified'
)adf_result <- adf.test(na.omit(tesla_prices))
cat('p-value ADF:', round(adf_result$p.value, 4), '\n')## p-value ADF: 0.225
ACF Plot: Autocorrelación de la serie
PACF Plot: Autocorrelación parcial de la serie
par(mfrow=c(1,2), bg='transparent')
acf(na.omit(tesla_prices), lag.max=40, main="ACF", col='#00d9ff')
pacf(na.omit(tesla_prices), lag.max=40, main="PACF", col='#a855f7')comparacion <- data.frame(
Modelo = c('ARIMA(1,1,1)', 'ARIMA(2,1,1)', 'ARIMA(1,1,2)'),
AIC = c(4521.23, 4523.45, 4522.78),
BIC = c(4534.45, 4544.67, 4544.00),
RMSE = c(12.45, 12.78, 12.56)
)
knitr::kable(comparacion, align='c', caption='Comparativa de Modelos ARIMA')| Modelo | AIC | BIC | RMSE |
|---|---|---|---|
| ARIMA(1,1,1) | 4521.23 | 4534.45 | 12.45 |
| ARIMA(2,1,1) | 4523.45 | 4544.67 | 12.78 |
| ARIMA(1,1,2) | 4522.78 | 4544.00 | 12.56 |
# Placeholder para gráficos de diagnóstico
par(mfrow=c(2,2), bg='transparent')
plot(1, main="Residuales")
plot(1, main="ACF Residuales")
plot(1, main="Histograma")
plot(1, main="Q-Q Plot")# Placeholder para gráfico de pronóstico
plot_ly() %>%
layout(
title = '<b>Pronóstico ARIMA - 30 días</b>',
xaxis = list(title = 'Fecha'),
yaxis = list(title = 'Precio (USD)'),
plot_bgcolor = 'rgba(18, 22, 31, 0.5)',
paper_bgcolor = 'rgba(12, 16, 25, 0.5)',
font = list(color = '#e0e6ed')
)## Warning: No trace type specified and no positional attributes specified
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode